package miniBanco.Dto.Mapper;

import java.util.ArrayList;

import miniBanco.Core.Cliente;
import miniBanco.Core.Cuenta;
import miniBanco.Core.Moneda;
import miniBanco.Core.Movimiento;
import miniBanco.Core.TipoCuenta;
import miniBanco.Dto.ClienteDTO;
import miniBanco.Dto.CuentaDTO;
import miniBanco.Dto.MovimientoDTO;
import miniBanco.Mapper.MapperRegistry;

public class DTOMapper {
   static DTOMapper instance;
   private DTOMapper()
   {
	   
   }
   public DTOMapper getInstance()
   {
	   if(instance == null)
		   instance = new DTOMapper();
	   return instance;
   }
   public static MovimientoDTO ToMovimientoDto(Movimiento mov)
   {
	   MovimientoDTO movDTO = new MovimientoDTO();
	   movDTO.setConcepto(mov.getConcepto().toString());
	   movDTO.setDescripcion(mov.getDescripcion());
	   movDTO.setFecha(mov.getFecha());
	   movDTO.setImporte(mov.getImporte());
	   movDTO.setIdCuenta(mov.getCuenta().getID());
	   return movDTO;
   }
   public static ArrayList<MovimientoDTO> ToMovimientoDtoList(ArrayList<Movimiento> movList)
   {
		ArrayList<MovimientoDTO> movimientoDtoList = new ArrayList<MovimientoDTO>();
		for(Movimiento m:movList){
			MovimientoDTO movDTO = DTOMapper.ToMovimientoDto(m);
			movimientoDtoList.add(movDTO);
		}	
		return movimientoDtoList;
   }   
 
   public static Cuenta ToCuenta(CuentaDTO cuentaDTO) {
	   Cuenta cuenta;
		   Moneda moneda = Moneda.fromValue(cuentaDTO.getMoneda());
		   int cbu = cuentaDTO.getCbu();
		   TipoCuenta tipoCuenta = TipoCuenta.fromValue(cuentaDTO.getTipoCuenta());
		   cuenta = new Cuenta(moneda,cbu,tipoCuenta);
		   
	   return cuenta;
	}
   
   public static CuentaDTO ToCuentaDto(Cuenta cuenta)
   {
	   CuentaDTO cuentaDTO = new CuentaDTO();
	   cuentaDTO.setCbu(cuenta.getNroCuenta());
	   cuentaDTO.setCliente(cuenta.getCliente().getNombre());
	   cuentaDTO.setId(cuenta.getID());
	   cuentaDTO.setMoneda(cuenta.getMoneda().getValue());
	   cuentaDTO.setMonedaDescripcion(cuenta.getMoneda().toString());
	   cuentaDTO.setTipoCuentaDescripcion(cuenta.getTipoCuenta().toString());
	   cuentaDTO.setSaldo(cuenta.getSaldo());
	   cuentaDTO.setTipoCuenta(cuenta.getTipoCuenta().getValue());
	   cuentaDTO.setIdCliente(cuenta.getCliente().getID());
	   return cuentaDTO;
   }
   public static ArrayList<CuentaDTO> ToCuentaDtoList(ArrayList<Cuenta> cuentaList)
   {
		ArrayList<CuentaDTO> cuentaDtoList = new ArrayList<CuentaDTO>();
		for(Cuenta cuenta:cuentaList){
			CuentaDTO cuentaDTO = DTOMapper.ToCuentaDto(cuenta);
			cuentaDtoList.add(cuentaDTO);
		}	
		return cuentaDtoList;
   }
   
   public static ClienteDTO ToClienteDto(Cliente cliente)
   {
		ClienteDTO cliDto = new ClienteDTO();
		cliDto.setCuit(cliente.getCuit());
		cliDto.setNroCliente(cliente.getNroCliente());
		cliDto.setRazonSocial(cliente.getNombre());
		cliDto.setDni(cliente.getDni());
		cliDto.setId(cliente.getID());
		return cliDto;
   }
 
   public static Cliente ToCliente(ClienteDTO cliDto)
   {
	   Cliente cliente;
	   long id = cliDto.getId();
	   int nroCliente = cliDto.getNroCliente();
	   if(id > 0)
	   {
		   cliente = MapperRegistry.GetInstance().ClienteMapper().find(cliDto.getId());
	   }else
	   {
		   cliente = new Cliente(nroCliente);
	   }
		cliente.setCuit(cliDto.getCuit());
		cliente.setDni(cliDto.getDni());
		cliente.setNombre(cliDto.getRazonSocial());
		return cliente;
   }
   
   public static ArrayList<ClienteDTO> ToClienteDtoList(ArrayList<Cliente> clienteList)
   {
		ArrayList<ClienteDTO> clienteDtoList = new ArrayList<ClienteDTO>();
		for(Cliente cliente:clienteList){
			ClienteDTO cliDto = DTOMapper.ToClienteDto(cliente);
			clienteDtoList.add(cliDto);
		}	
		return clienteDtoList;
   }

}
